export const state = () => ({
  // 全局加载状态
  loading: false,
  // 全局消息提示
  snackbar: {
    show: false,
    text: '',
    color: 'success',
    timeout: 3000
  },
  // 主题设置
  darkTheme: false,
  // 语言设置
  locale: 'zh'
})

export const mutations = {
  // 设置加载状态
  SET_LOADING(state, loading) {
    state.loading = loading
  },
  // 设置消息提示
  SET_SNACKBAR(state, snackbar) {
    state.snackbar = {
      ...state.snackbar,
      ...snackbar,
      show: true
    }
  },
  // 隐藏消息提示
  HIDE_SNACKBAR(state) {
    state.snackbar.show = false
  },
  // 设置主题
  SET_THEME(state, isDark) {
    state.darkTheme = isDark
  },
  // 设置语言
  SET_LOCALE(state, locale) {
    state.locale = locale
  }
}

export const actions = {
  // 显示加载状态
  setLoading({ commit }, loading) {
    commit('SET_LOADING', loading)
  },
  // 显示消息提示
  showSnackbar({ commit }, snackbar) {
    commit('SET_SNACKBAR', snackbar)
  },
  // 隐藏消息提示
  hideSnackbar({ commit }) {
    commit('HIDE_SNACKBAR')
  },
  // 切换主题
  toggleTheme({ commit, state }) {
    const newTheme = !state.darkTheme
    commit('SET_THEME', newTheme)
    // 保存到本地存储
    localStorage.setItem('darkTheme', newTheme)
    return newTheme
  },
  // 设置主题
  setTheme({ commit }, isDark) {
    commit('SET_THEME', isDark)
    // 保存到本地存储
    localStorage.setItem('darkTheme', isDark)
  },
  // 设置语言
  setLocale({ commit }, locale) {
    commit('SET_LOCALE', locale)
    this.$i18n.setLocale(locale)
    // 保存到本地存储
    localStorage.setItem('locale', locale)
  },
  // 初始化应用状态
  nuxtServerInit({ commit, dispatch }, { req }) {
    // 在服务端渲染时初始化状态
    // 这里可以从cookie或其他地方获取初始状态
  },
  // 客户端初始化
  initClient({ commit, dispatch }) {
    // 从本地存储加载主题设置
    const darkTheme = localStorage.getItem('darkTheme')
    if (darkTheme !== null) {
      commit('SET_THEME', darkTheme === 'true')
    }
    
    // 从本地存储加载语言设置
    const locale = localStorage.getItem('locale')
    if (locale) {
      commit('SET_LOCALE', locale)
    }
  }
}

export const getters = {
  // 获取加载状态
  isLoading: state => state.loading,
  // 获取消息提示
  snackbar: state => state.snackbar,
  // 获取主题
  isDarkTheme: state => state.darkTheme,
  // 获取语言
  currentLocale: state => state.locale
}